/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.losalpes.persistence;

import com.losalpes.persistence.entity.Mueble;
import com.losalpes.persistence.entity.TipoMueble;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
/**
 *
 * @author MER
 */
@Stateless
public class CatalogPersistenceServicesMock implements ICatalogPersistenceServices{
    private ArrayList<Mueble> ms = new ArrayList<Mueble>();
    private String[] nombresMuebles = new String[]{"Mesa Ovalada","Silla convencional","Silla Clasica","Mesa plegable","Mesa centro","Mueble Reclinable","Closet","Mesa Campestre","Escritorio","Silla Rustica"};

    /**
     * Constructor Vacio
     * Creación de la persistencia de muebles
     */
    public CatalogPersistenceServicesMock() {
            for (int i = 0; i < 10; i++) {
                Mueble m = null;
                if(i%2==0){
                    m = new Mueble("001"+i, nombresMuebles[i], "Descripción del mueble " + i, TipoMueble.Interior,
                                      "Plastico",10,10,10,"NEGRO",20);
                }else{
                    m = new Mueble("001"+i, nombresMuebles[i], "Descripción del mueble " + i, TipoMueble.Exterior,
                                      "Madera",10,10,10,"NEGRO",20);
                }
                
                ms.add(m);
            }
    }

    /**
     * Lista de todos muebles
     * @return Colección de muebles
     */
    public List<Mueble> findAllMuebles() {
        return ms;
    }

    /**
     * Adiciona un mueble
     * @param cMueble
     */
    public void add(Mueble cMueble) {
        String referencia = cMueble.getReferencia();
        boolean bOk = false;
        for(int i=0; i<ms.size(); i++)
        {
            String refMueble = ms.get(i).getReferencia();
            if(referencia.equals(refMueble))
            {
                bOk = true;
                i = ms.size();
            }
        }
        if(!bOk && referencia!= null && cMueble.getNombre()!= null
                && cMueble.getTipo()!= null
                && cMueble.getAlto()>0
                && cMueble.getAncho()>0
                && cMueble.getProfundidad()>0
                && cMueble.getPeso()>0)
        {
            String dimensiones = "Alto: " + String.valueOf(cMueble.getAlto()) +
                                 "cm, Ancho: " + String.valueOf(cMueble.getAncho()) +
                                 "cm, Profundidad: " + String.valueOf(cMueble.getProfundidad()) +
                                 "cm";
            cMueble.setDimensiones(dimensiones);
            ms.add(cMueble);
        }
    }

    /**
     * Actualiza un mueble
     * @param obj Mueble
     */
    public void update(Object obj) {
        Mueble mue = (Mueble) obj;
        if(mue.getReferencia()!= null && mue.getNombre()!= null
                && mue.getTipo()!= null
                && mue.getAlto()>0
                && mue.getAncho()>0
                && mue.getProfundidad()>0
                && mue.getPeso()>0)
        {
            String dimensiones = "Alto: " + String.valueOf(mue.getAlto()) +
                                     "cm, Ancho: " + String.valueOf(mue.getAncho()) +
                                     "cm, Profundidad: " + String.valueOf(mue.getProfundidad()) +
                                     "cm";
            mue.setDimensiones(dimensiones);
            ms.set(ms.indexOf(obj), (Mueble) obj);// .set(ms.indexOf(obj), obj);
        }
    }

    /**
     * Actualiza precio y cantidad de un mueble
     * @param obj Mueble
     */
    public void updatePrecioCantidad(Object obj) {
        Mueble mue = (Mueble) obj;
        ms.set(ms.indexOf(obj), (Mueble) obj);
    }

    /**
     * Elimina mueble
     * @param obj Mueble
     */
    public void delete(Object obj) {
        ms.remove(obj);
    }

    /**
     * Busca un mueble por referencia
     * @param ref Referencia del mueble a buscar
     * @return Objeto de tipo Mueble
     */
    public Object findByRef(Object ref) {
        for (Object m : findAllMuebles()) {
            Mueble mue = (Mueble) m;
            if (mue.getReferencia().equals(ref)) {
                return mue;
            }
        }
        return new Mueble();
    }

    /**
     * Busca muebles por tipo
     * @param typ Tipo de mueble a buscar
     * @return Objeto de tipo Mueble
     */
    public Object findByType(Object typ) {
        for (Object m : findAllMuebles()) {
            Mueble mue = (Mueble) m;
            if (mue.getTipo().toString().equals(typ)) {
                return mue;
            }
        }
        return new Mueble();
    }

    /**
     * Actualiza precio y cantidad por referencia
     * @param ref Referencia del mueble
     * @param precio Precio del mueble
     * @param cantidad Cantidad de muebles en inventario
     * @return Objeto de tipo Mueble
     */
    public Object setPrecioCantidadByRef(Object ref, double precio, double cantidad) {
        for (Object m : findAllMuebles()) {
            Mueble mue = (Mueble) m;
            if (mue.getReferencia().equals(ref)) {
                mue.setPrecio(precio);
                mue.setCantidad(cantidad);
                return mue;
            }
        }
        return new Mueble();
    }

    /**
     * Busca muebles disponibles
     * @return Colección de muebles disponibles
     */
    public ArrayList<Mueble> findMueblesDisponibles(){
        ArrayList<Mueble> mds = new ArrayList<Mueble>();
        Mueble m1 = new Mueble();
        m1.setAlto(100);
        m1.setAncho(100);
        m1.setColor("Negro");
        m1.setDescripcion("Un Mueble X");
        m1.setFoto("/img/fotoMueble.jpg");
        m1.setMaterial("Madera");
        m1.setNombre("Mueble X");
        m1.setPeso(20);
        m1.setProfundidad(50);
        m1.setReferencia("0001");
        m1.setTipo(TipoMueble.Interior);
        m1.setPrecio(100000);
        mds.add(m1);
        Mueble m2 = new Mueble();
        m2.setAlto(200);
        m2.setAncho(200);
        m2.setColor("Blanco");
        m2.setDescripcion("Un Mueble XX");
        m2.setFoto("/img/fotoMueble.jpg");
        m2.setMaterial("Acero");
        m2.setNombre("Mueble XX");
        m2.setPeso(30);
        m2.setProfundidad(40);
        m2.setReferencia("0002");
        m2.setTipo(TipoMueble.Exterior);
        m2.setPrecio(200000);
        mds.add(m2);
        Mueble m3 = new Mueble();
        m3.setAlto(300);
        m3.setAncho(300);
        m3.setColor("Gris");
        m3.setDescripcion("Un Mueble XXX");
        m3.setFoto("/img/fotoMueble.jpg");
        m3.setMaterial("PVC");
        m3.setNombre("Mueble XXX");
        m3.setPeso(40);
        m3.setProfundidad(10);
        m3.setReferencia("0003");
        m3.setTipo(TipoMueble.Interior);
        m3.setPrecio(300000);
        mds.add(m3);
        return mds;
    }

    /**
     * Busca muebles disponibles por referencia
     * @param ref Referencia del mueble
     * @return Mueble
     */
    public Mueble findMuebleDisponibleByRef(String ref){
        Mueble res = null;
        ArrayList<Mueble> mds = findMueblesDisponibles();
        for(Mueble m : mds){
            if(m.getReferencia().equals(ref)){
                res = m;
            }
        }
        return res;
    }

    /**
     * Busca muebles por tipo
     * @param tipoMueble Tipo de muebles por buscar
     * @return Colección de muebles del tipo buscado
     */
    public List<Mueble> findByType(TipoMueble tipoMueble) {
        ArrayList<Mueble> mueblesPorTipo = new ArrayList<Mueble>();
        for(Mueble m : ms){
            if(m.getTipo().compareTo(tipoMueble) == 0){
                mueblesPorTipo.add(m);
            }
        }
        return mueblesPorTipo;
    }
}
